import Vue from 'vue'
import Vuex from 'vuex'
import {
	reqAddress,
	reqFoodTypes,
	reqShops,
	reqPhoneLogin,
	reqUseNameLogin,
	reqGetUserInfo,
	reqLogout,
	reqGoods,
	reqBusinessInfo,
	reqRatings,
	reqSearchShops
} from '../utils/index.js'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
		address:{}, // 地址
		categorys:[], // 主页nav轮播图 
		shops:[], // 主页商家列表
		userinfo:{}, // 用户信息
		businessInfo:{}, // 商家信息
		goods:[], // 商家商品信息
		cartFood:[], // 选中的购物车内的食物
		ratings:[], // 菜品评论
		searchResult:[] // 搜索结果
  },
  mutations: {
	  // 设置根据经纬度获取到的地址
	  setAddress(state,value){
		  state.address = value
	  },
	  // 设置主页轮播图logo食品信息
	  setCategorys(state,value){
	  		  state.categorys = value
	  },
	  // 设置附近商家信息
	  setShops(state,value){
	  		  state.shops = value
	  },
	  // 设置用户信息
	  setUserInfo(state,userinfo){
			  state.userinfo = userinfo
	  },
	  // 清空用户信息
	  resetUserInfo(state){
		  state.userinfo = {}
	  },
	  // 设置商家信息
	  setBusinessInfo(state,info){
		  state.businessInfo = info
	  },
	  // 设置该商家的所有食品分类以及分类详情食物
	  setGoodsInfo(state,goods){
	  		  state.goods = goods
	  },
	  // 动态添加 count 属性值
	  dynamicAddorReduceCount(state,{status,food}){
		  if(status){
			  // 增加 1 add
			 if(!food.count){ // 没有 count 这个属性则添加,证明是第一次添加这个商品
				  Vue.set(food,'count',1)
				  state.cartFood.push(food) // 添加当前选中的food进去数组
				  // console.log(food)
			 }else{ // 有count属性则++
				 food.count++
			 }
		  }else{
			  // 减少 1 reduce
			  if(food.count){ // 有food.count这个属性才进行减减,则>0以上为真,等于0时为假不执行
				  food.count--
				  if(food.count <= 0){
					  state.cartFood.splice(state.cartFood.indexOf(food),1)
				  }
			  }
		  }
	  },
	  // 清空购物车
	  clearCart(state){
		  state.cartFood.forEach(food=> {
			  food.count = 0 // 这里如果不设置为0的话 Control 组件还是会显示数量,直接 delete 是没用的
			  delete food.count
		  })
		  state.cartFood = [] // 清空数组避免下次再重新添加food时,混入上次已选择的food
	  },
	  // 设置food评论结果
	  setRatings(state,ratings){
		  state.ratings = ratings
	  },
	  // 设置搜索店铺结果
	  setSearchShop(state,searchRes){
		  state.searchResult = searchRes
	  }
  },
  actions: {
	  // api 纬度放前面 经度放后面
	  async SETADDRESS({commit},{longitude,latitude}){
		  let geohash = latitude + ',' + longitude
		  try{
			  let res = await reqAddress(geohash)
			  // console.log(res)
			  commit('setAddress',res.data)
		  }catch(e){
			  console.log(e)
		  }
	  },
	  // 食品分类列表轮播图
	  async SETCATEGORY({commit}){
	  		  try{
	  			  let res = await reqFoodTypes()
	  			  // console.log(res)
	  			  commit('setCategorys',res.data)
	  		  }catch(e){
	  			  console.log(e)
	  		  }
	  },
	  // 商铺列表
	  async SETSHOPS({commit},{longitude,latitude}){
	  		  let geohash = latitude + ',' + longitude
	  		  try{
	  			  let res = await reqShops(geohash)
	  			  // console.log(res)
	  			  commit('setShops',res.data)
	  		  }catch(e){
	  			  console.log(e)
	  		  }
	  },
	  // 发起登录请求成功后返回登录成功的信息给外部调用者
	  async reqUserInfoUname({commit},obj){
	  		 return await reqUseNameLogin(obj)
	  },
	  // 登录成功后保存用户信息用户名登录 (这是一个同步的action)
	  SetUserInfoUname({commit},userinfo){
		  commit('setUserInfo',userinfo)
	  },
	  // 发起登录请求成功后返回登录成功的信息给外部调用者 (这是一个mock数据)
	  async reqUserInfoPhone(){
		   return await reqPhoneLogin() 
	  },
	  // 登录成功后保存用户信息手机号登录 (这是一个mock数据)
	   SetUserInfoPhone({commit},userinfo){
	  		   commit('setUserInfo',userinfo)
	  },
	  // 尝试向服务器获取用户登录信息,实现自动登录(避免成功登录后点刷新清除掉登录状态)
	  async tryGetUserLoginStatus({commit}){
		 let res = await reqGetUserInfo() // 请求后台的session 状态
		 if(res.code == 0 && res.data.name){
			 commit('setUserInfo',res.data)
		 }else if(res.code == 0 && res.data.phone){
			 commit('setUserInfo',res.data)
		 }else{
			 return new Error('error')
		 }
	  },
	  // 退出登录
	  async reqLogout({commit}){
		  let res =  await reqLogout()
		  if(res.code === 0){
			  commit('resetUserInfo')
			  return 'logoutSuccess'
		  }else{
			  return 'logoutError'
		  }
	  },
	  
	// mock 菜品nav + 菜品nav所属的菜品
	async REQGOODS({commit},cb){
		let res = await reqGoods()
		if(res.code == 0){
			commit('setGoodsInfo',res.goods)
			// 这里会先把请求到的数据保存到state里面然后先完成渲染再执行下面的cb方法
			cb && cb()	
		}
		// console.log(res)
	},
	// mock 商家信息
	async REQBUSINESSINFO({commit}){
		let res = await reqBusinessInfo()
		if(res.code == 0){
			commit('setBusinessInfo',res.info)
		}
		// console.log(res)
	},
	// mock 菜品评价
	async REQRATINGS({commit},cb){
		let res = await reqRatings()
		commit('setRatings',res.ratings)
		cb && cb()
		console.log(res,'rating')
	},
	// 同步方法,动态添加 count 属性值(这步有点多余啊~~~~~)
	DYNAMICADDCOUNT({commit},{updateStatus,food}){
		// console.log(food)
		if(updateStatus){
			// 增加 1 add
			commit('dynamicAddorReduceCount',{status:true,food})
		}else{
			// 减少 1 reduce
			commit('dynamicAddorReduceCount',{status:false,food})
		}
	},
	// 发起获取搜索店铺结果请求
	async REQGETSEARCHSHOP({commit},keyword){
		let res = await reqSearchShops({keyword})
		if(res.code === 0){
			commit('setSearchShop',res.data)
		}
	}
  },
  getters: {
	  totalPrice(state){ // 计算总价格
		   return state.cartFood.reduce((pre,food)=>{
			 return pre += food.count * food.price
		  },0)
	  }, 
	  totalFoodCount(state){ // 计算总数量
		  return state.cartFood.reduce((pre,food) => pre + food.count,0)
	  },
	  positiveSize(state){ // 计算菜品评论给予好评的数量
		  return state.ratings.reduce((prev,rating)=> prev += (rating.rateType === 0 ? 1 : 0),0)
	  }
  },
  modules: {
  }
})
